package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * @User: vitobo
 * @Date: 2024-08-12
 * @Description: 使用字节流来读取文件;
 *
 *  read会尽可能的把参数传进来的数组给填满,
 *  但是实际上, 文件剩余长度是有限的, 如果剩余长度超过1024, 此时这个1024个字节都会填满, 返回值就是1024
 *  如果文件当前 剩余的长度不足1024, 此时有多少就填多少, read方法就会返回当前实际读取的长度;
 *
 *
 */
public class IODemo6 {

    public static void main(String[] args) throws IOException {
        // 创建InputStream对象的时候, 使用绝对路径 或者 相对路径, 都是可以的, 也可以使用File对象;
        InputStream inputStream = new FileInputStream("f:/test.txt");

        // 一次读取多个字节, 进行读操作;
        while (true){
            // read的第二版本,需要调用者提前准备好一个数组,
            byte[] bytes = new byte[20];
            // 这里的传参, 相当于是把 刚才准备好的数组, 交给read方法,让read方法内部针对这个数组进行填写(此处参数相当于"输出型参数")
            int len = inputStream.read(bytes);
            System.out.println("len= " + len);
            if(len == -1){
                break;
            }
            // 此时读取的结果放到了bytes数组中;
            for (int i = 0; i < bytes.length; i++) {
                System.out.printf("%x\n", bytes[i]);
            }
        }

        inputStream.close();
    }

    // 如果要想打开一个文件去读, 就需要保证这个文件是存在的;
    public static void main1(String[] args) throws IOException {
        // 创建InputStream对象的时候, 使用绝对路径 或者 相对路径, 都是可以的, 也可以使用File对象;
        InputStream inputStream = new FileInputStream("f:/test.txt");

        // 一个字节一个字节, 进行读操作;
        while (true){
            // read 无参数版本, 一次读一个字节
            // read 一个参数版本: 把读到的内容填充到参数这个字节数组中,(此处的参数是个"输出型参数), 返回值是实际读取的字节数
            // read 三个参数版本: 和2类似, 只不过是往数组的一部分区间里尽可能填充;

            // 返回值, read读取的是 一个字节, 返回的是int, 除了要表示byte里的0-255(-128~127)这样的情况之外,
            // 还需要表示一个特殊情况: -1 这个情况表示读取到文件结束了(文件末尾了)
            int b = inputStream.read();
            if(b==-1){
                // 读取完毕
                break;
            }
            // 16进制打印
            System.out.println(" " + (byte)b);
        }

        inputStream.close();
    }
}
